<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>函数</title>
    <script>
        // 声明一个函数
        // [1] JavaScript 中声明函数使用 function 关键字
        // [2] 在函数名后面的括号中声明形参
        // [3] 在函数体中编写要执行的代码，有返回值就使用 return 语句
        function showMessage() {
            alert("Hello World!");
        }

        // a 和 b 就是函数声明的形参
        function sum(a, b) {
            // return 语句后面的值就是函数的返回值
            return a + b;
        }

        // 调用函数
        showMessage();
        let sumResult = sum(100, 200);
        alert(sumResult)

        // JavaScript 调用函数时，形参和实参的个数可以不一样
        sumResult = sum(10, 20, 30);
        console.log(sumResult)

        sumResult = sum(10);
        console.log(sumResult)

        // JavaScript 中函数本身也是一个对象，声明一函数相当于创建了一个对象
        // 等号右边：声明一个函数的同时也就创建了一个函数类型的对象
        // 等号左边：把函数这个对象的引用赋值给变量 showMessage2
        // 这样一来变量的名字就可以当做函数的名字来用
        let showMessage2 = function () {
            alert("Hello World! [showMessage2()函数执行了]");
        };

        // 打印函数本身
        console.log(showMessage2);

        // 把函数作为参数传递给另一个函数
        function showMessage3(argFun) {
            console.log(argFun);
        }
        showMessage3(showMessage2); // 传入函数对象，而不是调用函数

        // 本质上调用函数就是在函数引用的后面加括号
        showMessage2();

        // 所以我们一定要区分下面两种情况：
        // 函数名单独出现：引用函数对象
        // 函数名()：调用函数
        showMessage3(showMessage2()); // 先调用函数，然后把函数的返回值作为实参传入
    </script>
</head>
<body>

</body>
</html>